package br.com.filter.dm;

import java.io.IOException;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import br.com.login.faces.SessionUsaPreBean;
import constantes.CONSTANTES;

/**
 * Classe responsavel por fazer a validacao se a pessoa esta logada ou nao. uma
 * classe que implementa filtro web
 * 
 * @version 1.0.0
 * @since Janeiro,03 2012
 * @author Eduardo Francisco Barbosa
 */
public class LoginFilter implements Serializable, Filter {

    /**
	 * 
	 */
    private static final long serialVersionUID = 5383100287817272597L;

    /**
     * classe que analisa toda vez q uma requisicao e feita se precisa ou nao
     * redirecionar a pessoa para a tela de login novamente
     * 
     * doFilter
     * 
     * @param ServletRequest
     *            request
     * @param ServletResponse
     *            response
     * @param FilterChain
     *            chain
     * 
     * @throws IOException
     * @throws ServletException
     * 
     * @see javax.servlet.Filter
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
	    ServletException {

	HttpServletRequest req = (HttpServletRequest) request;
	HttpSession session = req.getSession();

	SessionUsaPreBean sessao = (SessionUsaPreBean) session.getAttribute("sessionUsaPreBean");

	Boolean debug = Boolean.FALSE;

	SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy hh:MM:ss");
	// System.out.println(req.getRequestURI());

	if (req.getRequestURI().contains(".js.") || req.getRequestURI().contains(".ecss")
		|| req.getRequestURI().contains(".png.jsf") || req.getRequestURI().contains(".jpg.jsf")) {

	    chain.doFilter(request, response);
	} else {

	    if (debug)
		System.out.println(sdf.format(new Date()) + "-->" + req.getRequestURI());

	    if (sessao != null) {

		if (debug)
		    System.out.println("------------------> Sessao já existente");

		if (req.getRequestURI().contains("loginDmClub.jsf")) {

		    if (debug)
			System.out.println("------------------> Requisição pela tela inicial: telainicial.jsf");

		    if (sessao.getLogado().equals(Boolean.TRUE)) {
			if (debug)
			    System.out
				    .println("------------------> Usuario já Logado --> Redirecionar para telainicalLogado");

			HttpServletResponse res = (HttpServletResponse) response;
			redireciona(res, req, "/" + CONSTANTES.URLUSAPRE + "/telainicialLogado.jsf");
		    } else {
			if (debug)
			    System.out.println("------------------> Usuario nao logado --> chain.doFilter ");
			chain.doFilter(request, response);
		    }

		} else {

		    if (debug)
			System.out.println("------------------> Usuario solicitando tela: " + req.getRequestURI());

		    if (req.getRequestURI().contains("cadastro.jsf") || req.getRequestURI().contains("loginDmClub.jsf")
			    || req.getRequestURI().contains("sobreUsaCardPre.jsf")
			    || req.getRequestURI().contains("todasVantagens.jsf")
			    || req.getRequestURI().contains("contato.jsf")
			    || req.getRequestURI().contains("cadastroDmClub.jsf")
			    || req.getRequestURI().contains("duvidasFrequentes.jsf")
			    || req.getRequestURI().contains("compreComDesconto.jsf")
			    || req.getRequestURI().contains("enviarMensagem.jsf")
			    || req.getRequestURI().contains("mensagemEnviadaComSucesso.jsf")
			    || req.getRequestURI().contains("descontosPorRamoDeAtividade.jsf")
			    || req.getRequestURI().contains("descontosPorRamoDeAtividadeMapa.jsf")
			    || req.getRequestURI().contains("conhecaRede.jsf")
			    || req.getRequestURI().contains("lojista.jsf")
			    || req.getRequestURI().contains("lojistaSolicitarCredenciamento.jsf")
			    || req.getRequestURI().contains("lojistaSolicitarCredenciamentoCadastro.jsf")
			    || req.getRequestURI().contains("lojistaCadastrarDesconto.jsf")
			    || req.getRequestURI().contains("lojistaCadastrarPrecos.jsf")
			    || req.getRequestURI().contains("lojistaGerenciamentoVendasRepasses.jsf")
			    || req.getRequestURI().contains("lojistaRecebimentoAntecipado.jsf")
			    || req.getRequestURI().contains("lojistaVantagens.jsf")
			    || req.getRequestURI().contains("listaEstabelecimentos.jsf")
			    || req.getRequestURI().contains("esqueceuSuaSenha.jsf")
			    || req.getRequestURI().contains("alterarFotoPerfil.jsf")) {

			if (debug)
			    System.out
				    .println("------------------> Tela autorizada para todos usuarios: chain.doFilter ");

			chain.doFilter(request, response);
		    } else {

			if (req.getRequestURI().contains("esqueceuSuaSenhaGerarNova.jsf")) {

			    if (debug)
				System.out
					.println("------------------> Tela autorizada para todos usuarios: getId , chain.doFilter ");

			    String id = request.getParameter("id");
			    sessao.setIdGerarSenha(id);

			    chain.doFilter(request, response);
			} else {

			    if (debug)
				System.out.println("------------------> Tela autorizada somente para usuarios logados");

			    if (sessao.getLogado().equals(Boolean.TRUE)) {

				if (debug)
				    System.out.println("------------------> Usuario logado ---> chain.doFilter");

				chain.doFilter(request, response);
			    } else {

				if (debug)
				    System.out
					    .println("------------------> Usuario nao logado ---> Redirecionar para telainicial");

				HttpServletResponse res = (HttpServletResponse) response;
				redireciona(res, req, "/" + CONSTANTES.URLUSAPRE + "/loginDmClub.jsf");
			    }
			}
		    }
		}

	    } else {

		if (debug)
		    System.out.println("------------------> Sessao nao existente");

		if (req.getRequestURI().contains(CONSTANTES.URLUSAPRE + "/loginDmClub.jsf")) {

		    if (debug)
			System.out.println("------------------> Tela inicial solicitada ---> chain.doFilter ");
		    chain.doFilter(request, response);

		} else {

		    if (req.getRequestURI().contains("cadastro.jsf") || req.getRequestURI().contains("loginDmClub.jsf")
			    || req.getRequestURI().contains("sobreUsaCardPre.jsf")
			    || req.getRequestURI().contains("todasVantagens.jsf")
			    || req.getRequestURI().contains("contato.jsf")
			    || req.getRequestURI().contains("cadastroDmClub.jsf")
			    || req.getRequestURI().contains("duvidasFrequentes.jsf")
			    || req.getRequestURI().contains("compreComDesconto.jsf")
			    || req.getRequestURI().contains("enviarMensagem.jsf")
			    || req.getRequestURI().contains("mensagemEnviadaComSucesso.jsf")
			    || req.getRequestURI().contains("descontosPorRamoDeAtividade.jsf")
			    || req.getRequestURI().contains("descontosPorRamoDeAtividadeMapa.jsf")
			    || req.getRequestURI().contains("conhecaRede.jsf")
			    || req.getRequestURI().contains("lojista.jsf")
			    || req.getRequestURI().contains("lojistaSolicitarCredenciamento.jsf")
			    || req.getRequestURI().contains("lojistaSolicitarCredenciamentoCadastro.jsf")
			    || req.getRequestURI().contains("lojistaCadastrarDesconto.jsf")
			    || req.getRequestURI().contains("lojistaCadastrarPrecos.jsf")
			    || req.getRequestURI().contains("lojistaGerenciamentoVendasRepasses.jsf")
			    || req.getRequestURI().contains("lojistaRecebimentoAntecipado.jsf")
			    || req.getRequestURI().contains("lojistaVantagens.jsf")
			    || req.getRequestURI().contains("listaEstabelecimentos.jsf")
			    || req.getRequestURI().contains("esqueceuSuaSenha.jsf")) {

			if (debug)
			    System.out.println("------------------> Tela permitida solicitada ---> chain.doFilter ");

			chain.doFilter(request, response);

		    } else {

			if (debug)
			    System.out
				    .println("------------------> Outra tela solicitada ---> Redirecionar para telainicial");

			HttpServletResponse res = (HttpServletResponse) response;
			redireciona(res, req, "/" + CONSTANTES.URLUSAPRE + "/loginDmClub.jsf");

		    }

		}

	    }

	}

    }

    /**
     * classe que analisa se a requisição é uma requisição ajax para fazer o
     * direcionamento correto
     * 
     * redireciona
     * 
     * @param HttpServletResponse
     *            res
     * @param HttpServletRequest
     *            req
     * 
     * @throws IOException
     */
    public void redireciona(HttpServletResponse res, HttpServletRequest req, String url) throws IOException {
	if ("partial/ajax".equals(req.getHeader("Faces-Request"))) {
	    res.setContentType("text/xml");
	    res.getWriter().append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
		    .printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", url);
	} else {
	    res.sendRedirect(url);
	}
    }

    @Override
    public void destroy() {

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }

}
